package com.cloud.rec.util;

import com.cloud.core.exception.MyException;

import java.util.Arrays;

public class CheckSumUtil {

    public static String processVin(String vin, byte monitor_car_status) {
        // 验证VIN长度
        if (vin == null || vin.length() != 17) {
            throw new MyException("VIN必须为17位字符");
        }

        // 步骤1：计算Byte1数组
        int[] byte1 = new int[3];
        // 第2位和第6位（索引1和5）
        byte1[0] = (vin.charAt(1) + vin.charAt(5)) & 0xFF;
        // 第4位和第9位（索引3和8）
        byte1[1] = (vin.charAt(3) + vin.charAt(8)) & 0xFF;
        // 第15位和第17位（索引14和16）
        byte1[2] = (vin.charAt(14) + vin.charAt(16)) & 0xFF;

        // 步骤2：组合Byte2数组
        int[] byte2 = new int[2];
        // 组合Byte2[1]（高4位来自byte1[0]，低4位来自byte1[1]）
        int highNibble1 = (byte1[0] & 0xF0) >> 4;
        int lowNibble2 = byte1[1] & 0x0F;
        byte2[0] = (highNibble1 << 4) | lowNibble2;

        // 组合Byte2[2]（低4位来自byte1[0]，高4位来自byte1[1]）
        int lowNibble1 = byte1[0] & 0x0F;
        int highNibble2 = (byte1[1] & 0xF0) >> 4;
        byte2[1] = (lowNibble1 << 4) | highNibble2;

        //输出各个byte的值
        System.out.println("byte1:"+ Arrays.toString(byte1));
        System.out.println("byte2:"+ Arrays.toString(byte2));

        int key1 = ((~byte2[0])^monitor_car_status) & 0xF0;
        int key2= ((~byte2[1])^monitor_car_status) & 0xFF;
        int addResult= (byte1[2]+key2);
        System.out.println("addResult:"+addResult);
        /*while (addResult > 0xFF) {
            addResult = (addResult & 0xFF) + (addResult >> 8);
        }*/
        int key3 = addResult ^ monitor_car_status;
        byte firstByte = (byte) (key3 & 0xFF);
        // 提取第二个字节
        byte secondByte = (byte) ((key3 >> 8) & 0xFF);
        // 计算两个字节的和
        key3 = firstByte + secondByte;


        int key4 = key1 + monitor_car_status;
        System.out.println("key1:"+key1);
        System.out.println("key2:"+key2);
        System.out.println("key3:"+key3);
        System.out.println("key4:"+key4);
        System.out.println("addResult:"+addResult);

        return String.format("%02X",key4) + String.format("%02X",key2) + String.format("%02X",key3);
    }
}
